/*
 * CommunicationRobot16.cpp
 *
 */

#include <sstream>
#include "CommunicationRobot16.h"

namespace middleware {

const Uid CommunicationRobot16::UIDTomarCaja = "robot16TomarCaja";
const Uid CommunicationRobot16::UIDDespachoReply = "robot16dDespachoReply";

CommunicationRobot16::CommunicationRobot16():
		m_RequestQueue(ipc::MessageQueue<TomarCajaRequestStruct>::
		get(IPCUids::getFile(UIDTomarCaja,false),IPCUids::getKey(UIDTomarCaja))),
		m_ReplyQueue(ipc::MessageQueue<DespachoReplyStruct>::
		get(IPCUids::getFile(UIDDespachoReply,false),IPCUids::getKey(UIDDespachoReply)))
{

}

CommunicationRobot16::~CommunicationRobot16()
{
}

void CommunicationRobot16::obtenerProductoParaDespacho(OrdenCompraHeader& ordenCompra,
		TipoProducto& tipoProducto,
		Producto& producto)
{
	TomarCajaRequestStruct request;
	DespachoReplyStruct reply;

	request.ordenCompra = ordenCompra;
	request.tipoProducto= tipoProducto;
	request.remitente=DESPACHO;

	m_RequestQueue.put(1,request);

	reply = m_ReplyQueue.get(1);

	if(reply.ordenCompra.ordenCompraId != ordenCompra.ordenCompraId ||
			reply.ordenCompra.clientId != ordenCompra.clientId ||
			reply.producto.tipo != tipoProducto)
	{
		std::stringstream ss;
		ss << "Me trajeron el producto equivocado"
		   << " tipoProducto:"<<reply.producto.tipo
		   << " clientId:"<<reply.ordenCompra.clientId
		   << " ordenCompra:"<<reply.ordenCompra.ordenCompraId;

		throw Exception(ss.str());
	}

	producto = reply.producto;
}

void CommunicationRobot16::getPedidoRobot16(OrdenCompraHeader& ordenCompra,
												  TipoProducto& tipoProducto,
												  RemitenteRequest& remitente)
{
	TomarCajaRequestStruct request;

	request = m_RequestQueue.get(1);
	tipoProducto = request.tipoProducto;
	ordenCompra = request.ordenCompra;
	remitente = request.remitente;
}


void CommunicationRobot16::notificarNuevoProducto()
{
	TomarCajaRequestStruct request;
	request.ordenCompra.clientId=0;
	request.tipoProducto= 0;
	request.remitente=ROBOT14;

	m_RequestQueue.put(1,request);
}

void CommunicationRobot16::entregarProductoDespacho(OrdenCompraHeader& ordenCompra,
															Producto& producto)
{
	DespachoReplyStruct reply;

	reply.ordenCompra = ordenCompra;
	reply.producto = producto;

	m_ReplyQueue.put(1,reply);
}

void CommunicationRobot16::create()
{
	ipc::MessageQueue<TomarCajaRequestStruct>::createNonExclusive(IPCUids::getFile(UIDTomarCaja,false),IPCUids::getKey(UIDTomarCaja));
	ipc::MessageQueue<DespachoReplyStruct>::createNonExclusive(IPCUids::getFile(UIDDespachoReply,false),IPCUids::getKey(UIDDespachoReply));
}

void CommunicationRobot16::destroy()
{
	ipc::MessageQueue<TomarCajaRequestStruct>::destroyNonExclusive(IPCUids::getFile(UIDTomarCaja,false),IPCUids::getKey(UIDTomarCaja));
	ipc::MessageQueue<DespachoReplyStruct>::destroyNonExclusive(IPCUids::getFile(UIDDespachoReply,false),IPCUids::getKey(UIDDespachoReply));
}
}

 /* namespace middleware */
